// 这段代码的主要功能是将HTML中的表格数据转换为TypeScript接口定义，以便在TypeScript项目中使用。代码中使用了递归和循环来处理嵌套的数据结构，并且通过生成TypeScript代码的方式，使得数据结构更加清晰和易于维护。
// 定义getText函数，接受一个参数title，表示要查找的标题
function getText(title) {
  let elements = null;
  // 获取所有class为"api-title"的元素
  document.getElementsByClassName("api-title").forEach((item) => {
    // 如果找到与传入参数title相匹配的元素
    if (item.innerText === title)
      // 将elements设置为该元素的下一个兄弟元素，这些元素包含"ant-table-row"类
      elements = item.nextSibling.getElementsByClassName("ant-table-row");
  });
  // 初始化一些变量，用于后续的数据结构构建
  let minLevel = 0, // 初始化最小级别为100
    maxLevel = 0, // 初始化最大级别为0
    objectArray = [], // 创建一个空数组，用于存储对象
    load = { datas: [] }, // 创建一个对象，用于临时存储数据
    continuity = false, // 初始化连续性标志为false
    textLoad = ""; // 初始化文本承载字符串为空
  // 根据传入的title参数，创建一个基础对象，并将其添加到objectArray数组中
  objectArray.push({
    class: "-1",
    key: title === "请求参数" ? "request" : "response",
    title: title === "请求参数" ? "request" : "response",
    type: title === "请求参数" ? "request" : "response",
  });
  // 遍历elements数组中的每个元素
  elements.forEach((item) => {
    // 获取当前元素的级别，并更新minLevel和maxLevel
    if (item.className.split("").at(-1) > maxLevel)
      maxLevel = item.className.split("").at(-1);
    if (item.className.split("").at(-1) < minLevel)
      minLevel = item.className.split("").at(-1);
    // 创建一个对象，包含当前元素的相关信息，并添加到objectArray数组中
    objectArray.push({
      class: item.className.split("").at(-1),
      key: item.children[0].innerText, // 参数名称
      title: item.children[1].innerText, // 参数说明
      type: item.children[title === "请求参数" ? 4 : 2].innerText, // 类型
      require: title === "请求参数" ? item.children[3].innerText : "", // 是否必须
    });
  });
  // 从最大级别开始向下遍历，构建最终的数据结构
  while (minLevel <= maxLevel) {
    for (let i = objectArray.length - 1; i >= 0; i--) {
      // 如果当前对象的级别不等于最大级别，设置连续性为false
      if (objectArray[i].class != maxLevel) continuity = false;
      // 如果当前对象的级别等于最大级别
      if (objectArray[i].class == maxLevel) {
        // 如果load.datas数组为空，设置load.end为当前索引
        if (load.datas.length == 0) load.end = i;
        // 设置连续性为true
        continuity = true;
        // 将当前对象添加到load.datas数组中
        load.datas.unshift(objectArray[i]);
      }
      // 如果load.datas数组不为空且连续性为false，执行数据处理
      if (load?.datas.length > 0 && !continuity) {
        // 设置load.start为当前索引+1
        load.start = i + 1;
        // 将load.datas数组中的数据作为当前对象的children属性
        objectArray[i].children = load.datas;
        // 调用generate函数，生成TypeScript接口代码
        textLoad = generate(objectArray[i], load) + textLoad;
        // 从objectArray数组中移除已处理的数据
        objectArray.splice(load.start, load.end - load.start + 1);
        // 重置load对象
        load = { datas: [] };
      }
    }
    // 减小最大级别，继续下一轮循环
    maxLevel--;
  }
  // 定义generate函数，用于生成TypeScript接口代码
  function generate(item, load) {
    let temp = `class LL${format(item.key)}Model: LLBaseModel { \n`;
    let mapping = "\n\toverride func mapping(map: Map) { \n";
    load.datas.forEach((value) => {
      let type = value.type;
      let tempType = "";
      if (type.indexOf("integer") >= 0) tempType = "Int = 0";
      else if (type.indexOf("string") >= 0) tempType = 'String = ""';
      else if (type.indexOf("boolean") >= 0) tempType = "Bool = false";
      else if (type.indexOf("array") >= 0)
        tempType = `[LL${format(value.key)}Model] = []`;
      temp += `\n\t///${value.title}\n`;
      temp += `\tvar ${value.key}: ${tempType}\n`;
      mapping += `\t\t${value.key} <- map["${value.key}"]\n`;
    });
    mapping += "\t}\n";
    temp += mapping;
    // 构建接口的结束部分，并将其添加到textLoad字符串中
    return (temp += "}\n");
  }
  // 定义format函数，用于将字符串的首字母大写
  function format(string) {
    return string.charAt(0).toUpperCase() + string.slice(1);
  }
  // 返回生成的TypeScript接口代码
  return textLoad;
}
// 调用getText函数，打印生成的TypeScript接口代码
console.log(getText("请求参数") + "\n" + getText("响应参数"));
